<?php

defined('USER_SESSION') || define('USER_SESSION', Loader::getConfig('session', 'user'));

class UserController extends Controller
{

    public function view()
    {
        $user = new User();
        $check = $user->checkLogin(array(
            'user' => 'admin',
            'pass' => '123'
        )) ? 'Successful' : 'failed';

        $this->assign('check', $check);
    }

    public function exists()
    {
        $c = User::getUserIdByUsername($_POST['user']) ? 0 : -1;
        $this->assign('code', $c);
    }

    public function login($redirect)
    {
        $redirect = ROOT_URL . $redirect;

        $this->ignoreMasterTemplate();
        $this->assign('redirect', $redirect);
        $this->assign('root', ROOT_URL);

        if (isset($_POST['user']) && isset($_POST['pass'])) {
            if (User::checkLogin($_POST)) {
                $this->assign('code', 0);
                self::setLogged(User::getUserIdByUsername($_POST['user']));
                if (isset($_POST['remember']) && $_POST['remember'] == 'true') {
                    $cookieTimeout = Loader::getConfig('cookie', 'timeout') + time();
                    setcookie(Loader::getConfig('cookie', 'username'), $_POST['user'], $cookieTimeout);
                    setcookie(Loader::getConfig('cookie', 'password'), App::password($_POST['pass']), $cookieTimeout);
                    setcookie(Loader::getConfig('cookie', 'fake_key'), Loader::getConfig('cookie', 'fake_value'),
                        $cookieTimeout);

                    App::debugLog('Set cookie!');
                }
            } else {
                $this->assign('code', 1);
                $this->assign('msg', 'Login failed');
            }
        }
    }



    public function pass($input = null)
    {
        $input && $this->assign('result', App::password($input));
        isset($_POST['input']) && $this->assign('encrypted', App::password($_POST['input']));
    }

    /* get current user info */
    public function current()
    {
        $data = self::getLoggedUserInfo();
        unset($data['u_matkhau']);
        unset($data['u_taikhoan']);
        $this->assign($data);
    }

    public static function test()
    {
        App::debugLog(self::getLoggedUserInfo());
    }

    # Giao diện cập nhật thông tin cá nhân người dùng hiện tại
    public function update()
    {
        if (!App::isAjaxRequest() && !self::isLogged()) {
            App::redirect('dang-nhap/tai-khoan');
        } elseif (App::isAjaxRequest() && !self::isLogged()) {
            $this->assign('code', -1);
            $this->assign('message', 'truy cập bị từ chối!');
        } elseif (self::isLogged()) {
            if (!App::isAjaxRequest()) {
                $info = self::getLoggedUserInfo();
                $this->assign($info);
            }

            if (isset($_POST['ten'])) {
                User::update(self::getLoggedUser('user_id'),
                    $_POST['ten'] ,$_POST['diachi'],
                    $_POST['sodt'], $_POST['email']);
                $this->assign('code', 0);
            }
        }
    }

    /** Static methods */

    public static function setLogged($user_id)
    {
        $_SESSION[USER_SESSION] = array(
            'user_id' => $user_id,
            'user_type' => User::getUserType($user_id)
        );
    }

    public static function getLoggedUser($field = null)
    {
        return self::isLogged() ?
            ($field ? $_SESSION[USER_SESSION][$field] : $_SESSION[USER_SESSION])
            : FALSE;
    }

    public static function logOut()
    {
        if (isset($_SESSION[USER_SESSION])) {
            unset($_SESSION[USER_SESSION]);
        }

        App::clearCookie();
    }

    public static function isLogged()
    {
        return isset($_SESSION[USER_SESSION]['user_id']);
    }

    public static function isLoggedAdmin()
    {
        return isset($_SESSION[USER_SESSION]['user_type']) && $_SESSION[USER_SESSION]['user_type'] == 'admin';
    }


    public static function getLoggedUserInfo($field = null)
    {
        if (self::isLogged()) {
            $info = User::getUserInfo(self::getLoggedUser('user_id'));
            if ($field != null && array_key_exists($field, $info)) {
                return $info[$field];
            } else {
                return $info;
            }
        } else {
            return FALSE;
        }
    }

    public static function getLoggedUserUrl()
    {
         return (UserController::isLogged() ? 'user/view/' . UserController::getLoggedUser('user_id') . '-' .
                UserController::getLoggedUserInfo('u_taikhoan')
                : 'user/login');
    }

    # thay đổi mật khẩu
    public function password()
    {
        if (!self::isLogged()) {
            App::setException('Xin vui lòng <a href="dang-nhap/mat-khau" class="slink">đăng nhập</a> trước khi thực hiện đổi mật khẩu!', 'mat-khau', 1102);
        }

        $this->assign('page_title', 'MMobile - Thay đổi mật khẩu người dùng', true);

        # Xử lý client
        if (isset($_POST['old_password']) && isset($_POST['new_password'])) {
            if (User::checkLogin(array(
                'user' => self::getLoggedUser('user_id'),
                'pass' => $_POST['old_password'],
                'use_id' => true
            ))) {
                User::changePassword(self::getLoggedUser('user_id'), $_POST['new_password']);
                $this->assign('code', 0);
                App::clearCookie();
            } else {
                $this->assign('code', -1);
                $this->assign('msg', 'Mật khẩu củ không đúng, vui lòng kiểm tra lại!');
            }
        }
    }

    public function captcha($param)
    {
        $this->ignoreMasterTemplate();
        App::captcha();

    }
    # Quên mật khẩu
    public function forgot()
    {
        # Xử lý ajax request
        if (isset($_POST['user'])) {
            # Check captcha
            if (md5($_POST['captcha']) != App::getCaptchaCode()) {
                $this->assign('code', -3);
                $this->assign('msg', 'Nhập mã bảo mật không hợp lệ, vui lòng kiểm tra lại');
            } elseif (User::exists($_POST['user'])) {
                $userInfo = User::getUserInfo($_POST['user'], true);

                $newPass = App::genPassword();
                User::changePassword($_POST['user'], $newPass, true);
                $email_content = new SmTemplate();
                $email_content->assign('new_pass', $newPass);
                $email_content = $email_content->render(VIEWS_DIR . 'email/templates/password.tpl');

                $send_stt = Email::send($userInfo['u_ten'], $userInfo['u_email'], '[MMobile] Cấp mật khẩu mới', $email_content);

                $email = '*****' . substr($userInfo['u_email'], 5);

                if ($send_stt == null) {
                    $this->assign('code', 0);
                    $this->assign('email', $email);
                } else {
                    $this->assign('code', -2);
                    $this->assign('msg', 'Gửi email thất bại, xin vui lòng thử lại');
                }
            } else {
                $this->assign(array(
                    'code' => -1,
                    'msg' => 'Tên đăng nhập [' . $_POST['user'] . '] không tồn tại trong hệ thống!'
                ));
            }
        } else {
            $this->assign('email', Loader::getConfig('email', 'address'));
        }
    }
}